/* 场景 */
#ifndef __SCENE_H__
#define __SCENE_H__

#include "Global.h"
#include "Player.h"
#include "Monster.h"
#include "Shop.h"
#include "Box.h"
#include "Ladder.h"
#include "FileTools.h"
#include "StdMyString.h"

class Box;
class Ladder;

// 场景
class Scene
{
public:
    // 构造 ——场景初始化（宽，高，玩家）
    Scene(int width, int height, Player &p);
    // 秀一下场景
    void show();

    // 进入商店
    void BuyInShop();

    // 战斗
    // 判断和怪兽是否在同一位置
    Monster *IsMonsInSamePlace();

    // 判断和宝箱是否在同一位置
    Box *IsBoxInSamePlace();

    // 判断和梯子是否在同一位置
    Ladder *IsLadderInSamePlace();

    // 按下v存档或删档
    void Save(std::string &fileName);
    
    // 将怪物信息存入容器
    std::vector<std::string> GetMonsterInfo();
    // 将宝箱信息存入容器
    std::vector<std::string> GetBoxInfo();
    
    // 写入怪物信息
    void WriteInMonsterInfo(std::string &fileName);
    // 写入宝箱信息
    void WriteInBoxInfo(std::string &fileName);

    // 读取角色信息
    void ReadPlayer(std::string &fileName);
    // 读取背包信息
    void ReadBag(std::string &fileName);
    // 读取怪兽信息
    void ReadMonster(std::string &fileName);
    // 读取宝箱信息
    void ReadBox(std::string &fileName);

    friend class Scene2;
    friend class Scene3;

private:
    // 初始化所有的怪物
    void IntialMonsters();
    // 初始化所有的宝箱
    void IntialBoxex();
    // 初始化随机容器
    void InitRandContainer();
    // 获取随机坐标
    Point GetRandomPlaces();

    
    // 地图（二维数组）
    std::vector<std::vector<std::string>> Map;
    std::vector<Monster> Monsters; // 怪兽列表（用一个容器装所有的怪物）
    std::vector<Box> Boxes; // 宝箱列表
    std::vector<Point> RandPlaces; // 随机坐标容器
    Player &player; // 引用玩家成员
    Shop shop; // 商店
    int width; // 宽
    int height; // 高
};

// 战阶
void Battle(Player &p, Monster &m);
// 战阶界面
void BattleInterface(Player &p, Monster &m);

// 是否发生暴击
template <typename T1>
bool IsPower(T1 &character)
{
    // 暴击概率
    int PowerProb = rand() % 100 + 1;
    return character.GetPower() >= PowerProb;
}

// 是否闪避
template <typename T2>
bool IsDodge(T2 &character)
{
    // 闪避概率
    int DodgeProb = rand() % 100 + 1;
    return character.GetDodge() >= DodgeProb;
}

// 第二层场景
class Scene2 : public Scene
{
public:
    // 第二层场景构造
    Scene2(int width, int height, Player &p);
    // 秀一下第二层场景
    void show2();
};

// 第三层场景
class Scene3 : public Scene
{
public:
    // 第三层场景构造
    Scene3(int width, int height, Player &p);
    // 秀一下第三层场景
    void show3();
};


#endif